﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

namespace Backus.Log
{
    public class LogManager
    {
        public const string CARACTER_ENMASCARAMIENTO = "X";
        public const int TIPO_DATO_ENMASCARAMIENTO_MOVIL = 1;

        private string _archivoLog;
        string caracterEnmascaramiento = CARACTER_ENMASCARAMIENTO;

        public LogManager(string archivoLog)
        {
            _archivoLog = archivoLog;
        }
        private static StreamWriter fw;
        public static void ConsoleLog(string texto)
        {
            System.Console.WriteLine(texto);
        }

        public void FileLog(LogInfo oLogInfo, List<int> lstTipoDatosEnmascarar)
        {
            string cadena = oLogInfo.Descripcion;
            string lineaEnmascarada = enmascaraLog(lstTipoDatosEnmascarar, ref cadena);
            oLogInfo.Descripcion = cadena;
            FileLog(oLogInfo);
        }
        public void FileLog(LogInfo oLogInfo)
        {
            try
            {
                bool append = true;
                fw = new StreamWriter(_archivoLog, append);
                fw.WriteLine(obtenerLineaLog(oLogInfo));
                fw.Close();
            }
            catch (IOException e)
            {
                LogManager.ConsoleLog(e.Message);
            }
        }

        private static string obtenerLineaLog(LogInfo oLogInfo)
        {
            string separador = " ";
            string lineaLog = string.Empty;
            lineaLog += oLogInfo.FechaHora.ToString() + separador;
            lineaLog += oLogInfo.NombreComponente + separador;
            lineaLog += oLogInfo.NombreProceso + separador;
            lineaLog += oLogInfo.Descripcion + separador;
            lineaLog += oLogInfo.UsuarioProceso;

            return lineaLog;
        }

        private string enmascaraLog(List<int> lstTipoDatos, ref string cadenaLog)
        {
            List<int> ubicacionCoincidencias = new List<int>();

            foreach (int tipoDato in lstTipoDatos)
            {

                switch (tipoDato)
                {
                    case (TIPO_DATO_ENMASCARAMIENTO_MOVIL):
                        {
                            enmascaraTelefono(ref cadenaLog);
                            break;
                        }
                }
            }
            return cadenaLog;
        }

        private void enmascaraTelefono(ref string cadenaLog)
        {
            string sPattern = @"(\d{9}\d{11})";
            MatchCollection resultado = Regex.Matches(cadenaLog, sPattern);
            if (resultado != null)
                foreach (Match oMatch in resultado)
                {
                    cadenaLog = cadenaLog.Replace(oMatch.Value, "********");
                }
        }
    }
}
